// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "base/macros.h"
#include "base/observer_list.h"
#include "ui/chromeos/ime/input_method_menu_item.h"
#include "ui/chromeos/ui_chromeos_export.h"

#ifndef UI_CHROMEOS_IME_INPUT_METHOD_MENU_MANAGER_H_
#define UI_CHROMEOS_IME_INPUT_METHOD_MENU_MANAGER_H_

namespace base {
template <typename Type>
struct DefaultSingletonTraits;
} // namespace base

namespace ui {
namespace ime {

    class UI_CHROMEOS_EXPORT InputMethodMenuManager {
    public:
        class Observer {
        public:
            virtual ~Observer() { }

            // Called when the list of menu items is changed.
            virtual void InputMethodMenuItemChanged(
                InputMethodMenuManager* manager)
                = 0;
        };

        ~InputMethodMenuManager();

        void AddObserver(Observer* observer);
        void RemoveObserver(Observer* observer);

        // Obtains the singleton instance.
        static InputMethodMenuManager* GetInstance();

        // Sets the list of input method menu items. The list could be empty().
        void SetCurrentInputMethodMenuItemList(
            const InputMethodMenuItemList& menu_list);

        // Gets the list of input method menu items. The list could be empty().
        InputMethodMenuItemList GetCurrentInputMethodMenuItemList() const;

        // True if the key exists in the menu_list_.
        bool HasInputMethodMenuItemForKey(const std::string& key) const;

    private:
        InputMethodMenuManager();

        // For Singleton to be able to construct an instance.
        friend struct base::DefaultSingletonTraits<InputMethodMenuManager>;

        // Menu item list of the input method.  This is set by extension IMEs.
        InputMethodMenuItemList menu_list_;

        // Observers who will be notified when menu changes.
        base::ObserverList<Observer> observers_;

        DISALLOW_COPY_AND_ASSIGN(InputMethodMenuManager);
    };

} // namespace ime
} // namespace ui

#endif // UI_CHROMEOS_IME_INPUT_METHOD_MENU_MANAGER_H_
